home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d949.lha / BBBBS / BBBBS65.lha / rexx / ArcMsgs.rexx < prev    next >
OS/2 REXX Batch file  |  1993-07-31  |  10KB  |  414 lines

  1. /* $VER: ArcMsgs.rexx 6.2 © 1993 Richard Lee Stockton (31.7.93)
  2. archives unread conference messages into file in users email
  3. copyright 1991-93 Richard Lee Stockton  FREELY DISTRIBUTABLE
  4. */
  5.  
  6. SIGNAL ON BREAK_C
  7. SIGNAL ON ERROR
  8. SIGNAL ON SYNTAX
  9. OPTIONS FAILAT 999999
  10.  
  11. PARSE ARG name' 'single_dir' '.
  12. IF STRIP(single_dir)='' THEN single_dir=0
  13. IF name='' THEN CALL GETOUT(20)
  14.  
  15. CALL CLOSE(STDOUT)
  16. CALL OPEN(STDOUT,'RAM:ArcMsgs.STDOUT','W')
  17. SAY STRIP(SUBSTR(SOURCELINE(1),3))
  18. SAY
  19. CALL TIME('R')
  20.  
  21. figarg='s:CONFIG.BBS'
  22. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  23. x=OPEN(f,figarg,'R')
  24. IF x=0 THEN
  25.   DO
  26.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  27.     CALL GETOUT(21)
  28.   END
  29.  
  30. data.=''
  31. DO i=1 TO 33
  32.   data.i=READLN(f)
  33. END
  34. CALL CLOSE(f)
  35.  
  36. compos=POS('/*',data.1)
  37. IF compos>0 THEN data.1=LEFT(data.1,compos-1)
  38. bbsname = STRIP(data.1)
  39. sysop   = WORD(data.2,1)
  40. bbspath = WORD(data.6,1)
  41. IF ~EXISTS(bbspath) THEN
  42.   DO
  43.     SAY bbspath 'does not exist!'
  44.     CALL GETOUT(22)
  45.   END
  46. testchar=RIGHT(bbspath,1)
  47. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  48.  
  49. msgpath = WORD(data.7,1)
  50. IF ~EXISTS(msgpath) THEN
  51.   DO
  52.     SAY msgpath 'does not exist!'
  53.     CALL GETOUT(23)
  54.   END
  55. testchar=RIGHT(msgpath,1)
  56. IF testchar~='/' & testchar~=':' THEN msgpath=msgpath'/'
  57. msgpath=msgpath'MSG'
  58.  
  59. extension=WORD(data.32,1)
  60. arccom=data.33
  61. compos=POS('/*',data.33)
  62. IF compos>0 THEN data.33=LEFT(data.33,compos-1)
  63. arccom=STRIP(data.33)
  64. IF LEFT(extension,1)~='.' THEN
  65.   DO
  66.     extension='.lzh'
  67.     arccom='lharc -m m'
  68.   END
  69.  
  70. DO i=1
  71.   IF GETCLIP('BBS_MSGS'i)='' THEN  /* info clip for external STOP */
  72.     DO
  73.       CALL SETCLIP('BBS_MSGS'i,name)
  74.       CALL SETCLIP('BBS_STOP_MSGS'i)
  75.       clipnum=i
  76.       LEAVE i
  77.     END
  78. END
  79.  
  80. x=OPEN(f,bbspath'Users/'name,'R')
  81. IF x=0 THEN
  82.   DO
  83.     CALL DELAY(150)
  84.     x=OPEN(f,bbspath'Users/'name,'R')
  85.     IF x=0 THEN
  86.       DO
  87.         SAY name 'user file is missing!'
  88.         CALL GETOUT(24)
  89.       END
  90.   END
  91. data.=''
  92. DO i=1 TO 25
  93.   data.i=READLN(f)
  94. END
  95. CALL CLOSE(f)
  96. level=data.20%1
  97. lastread.=0
  98.  
  99. x=GETCLIP('BBS_'name'_22')
  100. IF x~='' THEN
  101.   DO
  102.     data.22=x
  103.     CALL SETCLIP('BBS_'name'_22')
  104.   END
  105.  
  106. msg.=''
  107. IF readopen(bbspath'Lists/Conferences') THEN
  108.   DO
  109.     DO i=1
  110.       line=READLN(f)
  111.       IF line='END' THEN BREAK
  112.       IF EOF(f) THEN BREAK
  113.       num=WORD(line,1)
  114.       IF DATATYPE(num,'N') THEN msg.num=WORD(line,2)
  115.     END
  116.     CALL CLOSE(f)
  117.   END
  118.  
  119. CALL SETCLIP('BBS_MSGS')
  120. CALL PRAGMA('P',-2)         /* lower the priority of this task */
  121.  
  122. oldt=0
  123. count=0
  124. archives=1
  125. CALL open_new()
  126.  
  127. filepath=bbspath'EmailFiles/'name
  128. CALL MAKEDIR(filepath)
  129. arcname=filepath'/BBBBS_'lastm
  130. IF GETCLIP('BBS_'name)~='' THEN arcname=filepath'/Messages'
  131. CALL open_arc()
  132. CALL newmsgs()
  133. CALL CLOSE(a)
  134. CALL DELAY(28)
  135. IF WORD(STATEF(arcname),2)<80 THEN CALL GETOUT(24)
  136. CALL write_msg()
  137. CALL GETOUT(0)
  138. EXIT
  139.  
  140.  
  141.  
  142. /* Functions */
  143.  
  144.  
  145. write_msg:
  146. IF GETCLIP('BBS_'name)~='' THEN RETURN
  147. CALL PRAGMA('P',0)         /* normal priority */
  148. ADDRESS COMMAND arccom arcname||extension arcname
  149. IF ~EXISTS(arcname||extension) THEN CALL GETOUT(27)
  150. CALL PRAGMA('P',-2)
  151. x=OPEN(f,bbspath'Email/'name'/BBBBS.'lastm,'W')
  152. IF x=0 THEN CALL GETOUT(26)
  153. CALL WRITELN(f,' Mail: 'lastm'   FILE: BBBBS_'lastm||extension)
  154. CALL WRITELN(f,' From: BBBBS')
  155. CALL WRITELN(f,'   To: 'name)
  156. CALL WRITELN(f,' Subj: 'subj)
  157. CALL WRITELN(f,' Date: 'DATE('W') DATE() TIME('C'))
  158. CALL WRITELN(f,LEFT('=',75,'='))
  159. CALL WRITELN(f,'Here are the archived new messages you requested.')
  160. t=(.5+TIME('E'))%1
  161. t=t-oldt
  162. oldt=t+oldt
  163. min=t%60
  164. hrs=min%60
  165. min=min//60
  166. sec=t//60
  167. temp=' - It took'
  168. IF hrs>1 THEN temp=temp hrs 'hours'
  169. ELSE IF hrs=1 THEN temp=temp '1 hour'
  170. IF min>1 THEN temp=temp min 'minutes'
  171. ELSE IF min=1 THEN temp=temp '1 minute'
  172. IF sec=1 THEN temp=temp '1 second'
  173. ELSE IF sec>0 THEN temp=temp sec 'seconds'
  174. temp=temp 'to compile these messages -'
  175. CALL WRITELN(f,temp)
  176. CALL CLOSE(f)
  177. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  178.   DO
  179.     oldmess=GETCLIP('BBS_MESSAGE')
  180.     IF oldmess~='' THEN oldmess=oldmess||'0D0A'x
  181.     CALL SETCLIP('BBS_MESSAGE',oldmess||'Your archived messages are waiting in Email.')
  182.   END
  183. RETURN
  184.  
  185.  
  186. open_new:
  187. subj='All New Conference Messages'
  188. IF single_dir>0 THEN subj=msg.single_dir' conference messages'
  189. IF WORD(finfo,2)>1400000 THEN subj=subj', part' archives
  190. IF GETCLIP('BBS_'name)='' THEN
  191.   DO
  192.     x=OPEN(f,bbspath'Numbers/LastMail','R')
  193.     IF x~=0 THEN lastm=READLN(f)+1
  194.     CALL CLOSE(f)
  195.     ADDRESS COMMAND 'ECHO >'bbspath'Numbers/LastMail 'lastm
  196.     x=OPEN(f,bbspath'Email/'name'/BBBBS.'lastm,'W')
  197.     IF x=0 THEN CALL GETOUT(26)
  198.     CALL WRITELN(f,' Mail: 'lastm'   FILE: BBBBS_'lastm)
  199.     CALL WRITELN(f,' From: BBBBS')
  200.     CALL WRITELN(f,'   To: 'name)
  201.     CALL WRITELN(f,' Subj: 'subj)
  202.     CALL WRITELN(f,' Date: 'DATE('W') DATE() TIME('C'))
  203.     CALL WRITELN(f,LEFT('=',75,'='))
  204.     CALL WRITELN(f,'Here are the new messages you requested.')
  205.     CALL WRITELN(f,'The collection process was interrupted.')
  206.     CALL CLOSE(f)
  207.   END
  208. RETURN
  209.  
  210.  
  211. countcheck:
  212. PARSE ARG fname' '.
  213. IF ~readopen(fname) THEN RETURN(cknum)
  214. retval=STRIP(READLN(f))
  215. CALL CLOSE(f)
  216. IF ~DATATYPE(retval,'N') THEN retval=0
  217. RETURN(retval)
  218.  
  219.  
  220. newmsgs:
  221. IF single_dir>0 THEN
  222.   DO
  223.     msgdir=single_dir
  224.     CALL readmsg()
  225.     RETURN
  226.   END
  227. CALL WRITELN(a,'Scanning all Conferences for new messages..')
  228. DO newi=1 TO level
  229.   IF msg.newi='' THEN ITERATE newi
  230.   msgdir=newi
  231.   CALL readmsg()
  232. END
  233. RETURN
  234.  
  235.  
  236. readmsg:
  237. IF msg.msgdir='' | FIND(data.21,msgdir)>0 THEN RETURN;   /* sysop excluded */
  238. IF WORD(data.22,msgdir)=-1 THEN RETURN;  /*  user excluded */
  239. IF DATATYPE(WORD(data.22,msgdir),'N') THEN
  240.   lastread.msgdir=WORD(data.22,msgdir)
  241. IF STRIP(SHOWDIR(msgpath||msgdir))='' THEN RETURN
  242. lstwrt=countcheck(bbspath'Numbers/LastMessage'msgdir 0)
  243. frstwrt=countcheck(bbspath'Numbers/FirstMessage'msgdir 0)
  244. temp=''
  245. IF lastread.msgdir>=lstwrt THEN
  246.   DO
  247.     lastread.msgdir=lstwrt
  248.     RETURN
  249.   END
  250. CALL WRITELN(a,'Entering' msg.msgdir 'Message Conference..')
  251. dirname=msgpath||msgdir
  252. msglist.=0 /* set read to 0, unread to 1, and reply >=2 */
  253. firstmess=999999
  254. testlist=SHOWDIR(dirname)
  255. DO i=1 TO WORDS(testlist)
  256.   test=WORD(testlist,i)
  257.   IF test>lastread.msgdir THEN msglist.test=1
  258.   IF test<firstmess THEN firstmess=test
  259. END
  260. IF firstmess=999999 THEN firstmess=0
  261. CALL countcheck(bbspath'Numbers/FirstMessage'msgdir firstmess)
  262. msgstatus=1
  263. DO msgloop=1
  264.   lastreadnum=lastread.msgdir
  265.   DO WHILE msglist.lastreadnum=0 & lastreadnum<lstwrt
  266.     lastreadnum=lastreadnum+1
  267.   END
  268.   lastread.msgdir=lastreadnum
  269.   IF lastreadnum=lstwrt & msglist.lstwrt=0 THEN RETURN
  270.   DO mess=lastread.msgdir TO lstwrt+1
  271.     IF msglist.mess~=msgstatus THEN ITERATE mess
  272.     IF msgstatus>1 THEN CALL WRITELN(a,'Following the thread, level' msgstatus-1'.')
  273.     msglist.mess=0
  274.     arg=dirname'/'mess
  275.     IF ~EXISTS(arg) THEN
  276.       DO
  277.         CALL WRITELN(a,'Message number' mess 'is missing.')
  278.         ITERATE mess
  279.       END
  280.     IF ~readopen(arg) THEN ITERATE mess
  281.     firstline  = READLN(f)
  282.     secondline = READLN(f)
  283.     thirdline  = READLN(f)
  284.     forthline  = READLN(f)
  285.     CALL CLOSE(f)
  286.     IF WORDS(firstline)>2 THEN  /* if replies, change their num to >1 */
  287.       DO
  288.         thread=SUBSTR(firstline,WORDINDEX(firstline,4))
  289.         DO tindx=1 TO WORDS(thread)
  290.           test=WORD(thread,tindx)
  291.           IF msglist.test~=0 THEN msglist.test=msgstatus+1
  292.         END
  293.       END
  294.     CALL add_msg(arg)
  295.     IF thread~='' THEN
  296.        DO
  297.          thread=''
  298.          msgstatus=msgstatus+1
  299.        END
  300.   END
  301.   IF msgstatus>1 THEN msgstatus=msgstatus-1
  302. END
  303. RETURN
  304.  
  305.  
  306. readopen:
  307. PARSE ARG fname
  308. ok=OPEN(f,fname,'R')
  309. IF ok~=0 THEN RETURN(1)
  310. SAY fname 'failed to open for reading!'
  311. RETURN(0)
  312.  
  313.  
  314. readlines:
  315. CALL CLOSE(f)
  316. PARSE ARG tempname readstart .
  317. IF ~readopen(tempname) THEN RETURN(1)
  318. IF readstart<2 THEN lynes.=''
  319. DO ri=readstart
  320.   line=READLN(f)
  321.   IF EOF(f) THEN BREAK
  322.   lynes.ri=line
  323. END
  324. lynes.0=ri-1
  325. RETURN
  326.  
  327.  
  328. open_arc:
  329. CALL CLOSE(a)
  330. x=OPEN(a,arcname,'W')
  331. IF x=0 THEN CALL GETOUT(30)
  332. temp='= Custom archived for' name
  333. IF WORD(finfo,2)>1400000 THEN temp=temp', part' archives
  334. CALL WRITELN(a,temp)
  335. CALL WRITELN(a,'=' bbsname  'conference messages to' DATE('W') DATE() TIME('C'))
  336. CALL WRITELN(a,'')
  337. RETURN
  338.  
  339.  
  340. add_msg:
  341. ARG addname .
  342. count=count+1
  343. IF count//5=0 THEN
  344.   DO
  345.     t=GETCLIP('BBS_STOP_MSGS'clipnum)
  346.     IF t~='' THEN CALL cleanup(t)
  347.   END
  348. finfo=STATEF(arcname)
  349. IF WORD(finfo,2)>1400000 THEN
  350.   DO
  351.     archives=archives+1
  352.     CALL WRITELN(a,CENTER('=== continued in part' archives '. ===',75))
  353.     IF GETCLIP('BBS_'name)~='' THEN
  354.       DO
  355.         IF EXISTS('Messages') THEN CALL RENAME('Messages','Mess1')
  356.         arcname=filepath'/Mess'archives
  357.       END
  358.     ELSE
  359.       DO
  360.         CALL write_msg()
  361.         x=OPEN(f,bbspath'Numbers/LastMail','R')
  362.         IF x~=0 THEN lastm=READLN(f)+1
  363.         ELSE lastm=lastm+1
  364.         CALL CLOSE(f)
  365.         ADDRESS COMMAND 'echo >'bbspath'Numbers/LastMail 'lastm
  366.         arcname=filepath'/BBBBS_'lastm
  367.         CALL open_new()
  368.       END
  369.     CALL open_arc()
  370.   END
  371. x=OPEN(b,addname,'R')
  372. IF x=0 THEN SAY addname 'failed to open for reading!'
  373. ELSE
  374.   DO
  375.     data=READCH(b,65000)
  376.     CALL CLOSE(b)
  377.     CALL WRITECH(a,data)
  378.   END
  379. CALL WRITELN(a,'')
  380. CALL WRITELN(a,'')
  381. RETURN
  382.  
  383.  
  384. cleanup:
  385. ARG t2 .
  386. CALL CLOSE(a)
  387. SAY 'User aborted!'
  388. IF t2='DELETE' THEN
  389.   DO
  390.     IF GETCLIP('BBS_'name)~='' THEN temp=bbspath'EmailFiles/'name'/Mess'
  391.     ELSE temp=LEFT(arcname,LENGTH(arcname)-4)
  392.     ADDRESS COMMAND 'c:delete' temp'#?'
  393.   END
  394. CALL GETOUT(0)
  395. RETURN
  396.  
  397.  
  398. BREAK_C:
  399. SAY 'BREAK_C at line' SIGL
  400. CALL GETOUT(1)
  401.  
  402.  
  403. ERROR:
  404. SYNTAX:
  405. GETOUT:
  406. ARG errorout
  407. IF RC='RC' THEN RC=0
  408. IF errorout>0 | RC>0 THEN SAY 'Error:' errorout'  RC='RC'  SIGL='SIGL
  409. CALL SETCLIP('BBS_MSGS'clipnum)
  410. CALL SETCLIP('BBS_STOP_MSGS'clipnum)
  411. EXIT errorout
  412.  
  413. /* end of ArcMsgs.rexx */
  414.